/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package livraria.database;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import livraria.database.exceptions.RegistroNaoEncontradoException;
import livraria.objects.*;
import livraria.utils.enums.CategEnum;

/**
 *
 * @author Ivanovikjch
 */
public abstract class DBUtils {
    
    //Obtem livro da database com o codigo enviado por parametro
    //TODO: implementar os metodos
    
    public static Livro getLivroByCodigo(int codigo) throws SQLException, RegistroNaoEncontradoException{
        Statement stm = Conexao.conecta().createStatement();
        ResultSet rs = stm.executeQuery("SELECT livros.nome, livros.categoria, livros.ano, estoque.nitens, estoque.operacao, valores.`data`, valores.valor FROM livros, estoque, valores WHERE livros.codigo = estoque.livro AND livros.codigo = valores.livro AND livros.codigo = "+codigo);
        if(!rs.next())
            throw new RegistroNaoEncontradoException();
        String nome = rs.getString("nome");
        CategEnum categoria = CategEnum.getCategByString(rs.getString("categoria"));
        int ano = rs.getInt("ano");
        int nitens = rs.getInt("nitens");
        boolean operacao = rs.getBoolean("operacao");
        Date data = rs.getDate("data");
        float valor = rs.getFloat("valor");
        rs.close();
        rs = stm.executeQuery("SELECT autor_livro.autor, autores.nome FROM autor_livro, autores WHERE autor_livro.autor = autores.codigo AND autor_livro.livro = "+codigo);
        ArrayList<Integer> ids = new ArrayList<Integer>();
        HashMap<Integer, String> nomes = new HashMap<Integer, String>();
        while(rs.next()){
            ids.add(rs.getInt("autor"));
            nomes.put(rs.getInt("autor"), rs.getString("nome"));
        }
        return new Livro(codigo, ano, nome, categoria, nomes, ids, nitens, operacao, valor, data, true);
    }
    
    public static Autor getAutorByCodigo(int codigo) throws RegistroNaoEncontradoException, SQLException{
        Statement stm = Conexao.conecta().createStatement();
        ResultSet rs = stm.executeQuery("SELECT nome FROM autores WHERE codigo = "+codigo);
        if(!rs.next())
            throw new RegistroNaoEncontradoException();
        String nome = rs.getString("nome");
        rs.close();
        rs = stm.executeQuery("SELECT autor_livro.livro, livros.nome FROM autor_livro, livros WHERE autor_livro.livro = livros.codigo AND autor_livro.autor = "+codigo);
        ArrayList<Integer> ids = new ArrayList<Integer>();
        HashMap<Integer, String> nomes = new HashMap<Integer, String>();
        while(rs.next()){
            ids.add(rs.getInt("livro"));
            nomes.put(rs.getInt("livro"), rs.getString("nome"));
        }
        return new Autor(codigo, nome, nomes, ids, true);
    }
    
    public static Cliente getClienteByCpf(int cpf) throws RegistroNaoEncontradoException, SQLException{
        Statement stm = Conexao.conecta().createStatement();
        ResultSet rs = stm.executeQuery("SELECT nome FROM clientes WHERE cpf_cnpj = "+cpf);
        if(!rs.next())
            throw new RegistroNaoEncontradoException();
        String nome = rs.getString("nome");
        rs.close();
        ArrayList<Integer> ids = new ArrayList<Integer>();
        ArrayList<Integer> nitens = new ArrayList<Integer>();
        ArrayList<Livro> livros = new ArrayList<Livro>();
        rs = stm.executeQuery("SELECT id, livro, nitens FROM vendas WHERE cliente = "+cpf);
        while(rs.next()){
            ids.add(rs.getInt("id"));
            nitens.add(rs.getInt("nitens"));
            livros.add(getLivroByCodigo(rs.getInt("livro")));
        }
        return new Cliente(cpf, nome, true);
    }
    public static ArrayList<Livro> obtemListaDeLivros() throws SQLException {
        ArrayList<Livro> lista = new ArrayList<Livro>();
        int codigo;
        int ano;
        String nome;
        CategEnum categoria;
        int nitens;
        boolean operacao;
        Date data;
        float valor;
        ArrayList<Integer> ids;
        HashMap<Integer, String> nomes;
        Statement stm = Conexao.conecta().createStatement();
        ResultSet rs = stm.executeQuery("SELECT livros.codigo, livros.nome, livros.categoria, livros.ano, estoque.nitens, estoque.operacao, valores.`data`, valores.valor FROM livros, estoque, valores WHERE livros.codigo = estoque.livro AND livros.codigo = valores.livro");
        while(rs.next()){
            codigo = rs.getInt("codigo");
            nome = rs.getString("nome");
            categoria = CategEnum.getCategByString(rs.getString("categoria"));
            ano = rs.getInt("ano");
            nitens = rs.getInt("nitens");
            operacao = rs.getBoolean("operacao");
            data = rs.getDate("data");
            valor = rs.getFloat("valor");
            rs.close();
            rs = stm.executeQuery("SELECT autor_livro.autor, autores.nome FROM autor_livro, autores WHERE autor_livro.autor = autores.codigo AND autor_livro.livro = "+codigo);
            ids = new ArrayList<Integer>();
            nomes = new HashMap<Integer, String>();
            while(rs.next()){
                ids.add(rs.getInt("autor"));
                nomes.put(rs.getInt("autor"), rs.getString("nome"));
            }
            lista.add(new Livro(codigo, ano, nome, categoria, nomes, ids, nitens, operacao, valor, data, true));
        }
        return lista;
    }
}
